/**
 * 项目名称: 指针运算.cpp
 * 项目路径: study/指针
 * 编辑时间: 2024年09月06日10时32分28秒
 * 用   户: 轻尘
 */

#include <bits/stdc++.h>

using namespace std;

int main() {
//    int a = 10;
//    //这里的*表示p是指针变量
//    int *p = &a;
//    //这里的*表示解引用
//    *p = 100;
//    cout << a << endl;

    /**
     * 指针加法/一维数组
     */
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int *p_1 = arr;//这种方式等同于 int* p_1 = arr[0].都是获取到数组元素的首地址
    for (int i = 0; i < sizeof(arr) / 4; i++)
        cout << *(p_1 + i) << " ";
    cout << endl;

    /**
     * 二维数组遍历
     */
    int arr_1[3][5] = {
            {1, 2, 3, 4, 5},
            {2, 3, 4, 5, 6},
            {3, 4, 5, 6, 7}
    };

    //此时,指针指向二维数组中第一个一维数组
    //二维数组可以看成需使用二级指针,当没使用第二个*解引用的时候,输出的数据就是对应的地址
    //由此在二维数组中 *p_2 代表的就是一维数组的地址,j就是每次偏移的地址
    int(*p_2)[5] = arr_1;
//      for(int i = 0;i<3;i++){
//          for(int j = 0;j<5;j++){
//              cout<<*(*p_2+j)<<" "<<*p_2+j<<" ";
//          }
//          cout<<endl;
//          p_2++;
//      }

    int a_1[] = {1, 2, 3, 4, 5};
    int a_2[] = {2, 3, 4, 5, 6};
    int a_3[] = {3, 4, 5, 6, 7};

    int *a_4[] = {a_1, a_2, a_3};
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 5; j++) {
            cout << (*(a_4[i] + j)) << " ";
        }
        cout << endl;
    }
    int **p_3 = a_4;
//      for(int i = 0;i<3;i++){
//          for(int j = 0;j<5;j++){
//              cout<<*(*p_3 +j)<<" "<<*p_3+j<<" ";
//          }r
//          cout<<endl;
//          p_3++;
//      }


    int i, j;

    int score[3][4] = {
            {65, 67, 70,  60},
            {80, 87, 90,  81},
            {90, 99, 100, 98}};

    //第一种方法，二维数组当成一维数组来访问
    int *p;
    printf("方法1，二维数组当成一维数组来访问：\n");//换行
    p = score[0];//或者&score[0][0]，都可以。
    for (i = 0; i < 3 * 4; i++)
        printf("%4d,", *(p + i));
    printf("\n");//换行

    //第二种方法，通过数组指针来访问
    int (*pr)[4];//数组指针
    printf("\n方法2，通过数组指针来访问：\n");//换行
    pr = score;
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++)
            printf("%4d,", *(*(pr + i) + j));
        printf("\n");//换行
    }

    //第三种方法，通过指向指针的指针+指针数组来访问
    int **pt;//指向指针的指针
    int *ptt[3];//指针数组
    printf("\n方法3，通过指向指针的指针+指针数组来访问：\n");//换行
    for (i = 0; i < 3; i++)
        ptt[i] = score[i];//给指针数组赋值
    pt = ptt;//需要通过指针数组来转换一下
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++)
            printf("%4d,", *(*(pt + i) + j));
        printf("\n");//换行
    }

    int tmp = 10;
    int tmq = 20;
    const int * test = &tmp;
    test = &tmq;
//    *test = tmp;
    cout<<*test;
}